#include"RingQueue.hpp"
#include<iostream>
#include<pthread.h>
#include<ctime>
#include<unistd.h>
using namespace std;

void *Productor(void *args)
{
    //args是void*类型的，我们需要先转换
    RingQueue<int> *rq=static_cast<RingQueue<int>*>(args);
    //让我们的线程处于死循环的状态，即一直生产
    while(true){
    int in=rand()%10+1;

    usleep(10);   //模拟处理数据所需时间
    rq->Push(in);
    cout<<"Productor make a num: "<<in<<" threadid: "<<pthread_self()<<endl;
    sleep(1);  //让生产者在生产一个数据后睡眠一秒，便于观察打印结果
    }
    return nullptr;
}
void *Consumer(void *args)
{
    RingQueue<int> *rq=static_cast<RingQueue<int>*>(args);
    while(true){
    int out=rq->Pop();
    usleep(100);   //模仿数据处理所需时间
    cout<<"Consumer get a num: "<<out<<" threadid: "<<pthread_self()<<endl;
    }
    return nullptr;
}
int main()
{
    srand(time(nullptr));
    RingQueue<int> *rq=new RingQueue<int>();
    pthread_t c,p;
      
    //创建生产和消费两个线程，并且将bq作为参数传给两者
    pthread_create(&p,nullptr,Productor,rq);
    pthread_create(&c,nullptr,Consumer,rq);

    //回收线程
    pthread_join(c,nullptr);
    pthread_join(p,nullptr);

    delete rq;
    return 0;
}